package com.atguigu.java8.lambdaDemo;

import org.junit.Test;

import java.util.*;
import java.util.function.Consumer;

/**
 * @author Xiaohong X Gou
 * @createTime 2022-10-11 13:01
 * @description
 * 一、语法
 * 语法格式一：无参数，无返回值
 *          ()->System.out.println("Hello lambda!");
 * 语法格式二：有一个参数，并且无返回值
 *          (x)-> System.out.println(x)
 *语法格式三：只有一个参数，小括号可不写
 *          x-> System.out.println(x)
 *语法格式四：有两个以上的参数，有返回值，并且lambda体中有多条语句
 *          Comparator<Integer> com=(x,y)->{
 *             System.out.println("函数式接口");
 *             return Integer.compare(x,y);
 *         };
 *语法格式五：若Lambda体中只有一条语句，return 和 大括号都可以省略不写
 *          Comparator<Integer> com=(x,y)-> Integer.compare(x,y);
 *语法格式六：Lambda表达式的参数列表的数据列表可以不写，因为JVM编译器通过上下文推断出，数据类型，即“类型推断”
 *
 * 左右遇一括号省
 * 左侧推断类型省
 *能省则省
 *
 * 二、Lambda需要“函数式接口”的支持
 * 函数式接口：接口中只有一个抽象方法的接口，可以使用@FunctionalInterface修饰
 *          可以检查是否是函数式接口
 */
public class TestLambda2 {
    @Test
    public void test1(){
        int num = 0;
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world"+num);
            }
        };
        r.run();
        System.out.println("................");
        Runnable r1=()-> System.out.println("hello lambda!");
        r1.run();
    }
    @Test
    public void test2(){
        Consumer<String> con=x-> System.out.println(x);
        con.accept("xxxxxx");
    }

    @Test
    public void test3(){
        Comparator<Integer> com=(x,y)->{
            System.out.println("函数式接口");
            return Integer.compare(x,y);
        };
    }

    @Test
    public void test4(){
        Comparator<Integer> com=(x,y)-> Integer.compare(x,y);
    }
    @Test
    public void test5(){
        //String[] strs = {"aaa","bbb","ccc"};

        //String[] strs;
        //strs={"aaa","bbb","ccc"};

        List<String> list=new ArrayList<>();

        show(new HashMap<>());
    }
    public void show(Map<String,Integer> map){};
    @Test
    public void test6(){
        Integer num = operation(100, x -> x * x);
        System.out.println(num);

        System.out.println(operation(200,(y)->y+200));
    }
    public Integer operation(Integer num,MyFun mf){
       return mf.getValue(num);
    }
}
